// 尾？ 是rust实现返回Result的一个语法糖，在上面的例子中，我们使用了`?`运算符。
// 它会将错误传递给调用者，而不是处理它。
// 如果`write!`宏失败了，那么`?`运算符会将`Err(e)`直接返回给调用者。
// 这使得编写和处理错误的代码更加简洁和直观。
// 类似于java的异常传播机制。

use std::fmt;

struct List(Vec<i32>);

struct List2(Vec<i32>);

impl fmt::Display for List {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let vec = &self.0;
        write!(f, "[")?;

        for (count, v) in vec.iter().enumerate() {
            if count != 0 {
                write!(f, "->")?;
            }
            write!(f, "{}", v)?;
        }
        write!(f, "]")
    }
}

// 复杂写法 每个Result都需要手动处理，繁琐且容易出错。
impl fmt::Display for List2 {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let vec = &self.0;
        match write!(f, "[") {
            Ok(_) => {}
            Err(e) => return Err(e),
        }

        for (count, v) in vec.iter().enumerate() {
            if count != 0 {
                match write!(f, ",") {
                    Ok(_) => {}
                    Err(e) => return Err(e),
                }
            }
            match write!(f, "{}", v) {
                Ok(_) => {}
                Err(e) => return Err(e),
            }
        }
        
        match write!(f, "]") {
            Ok(_) => fmt::Result::Ok(()),
            Err(e) => return Err(e),
        }
    }
}

fn main() {
    let v = List(vec![1, 2, 3]);
    println!("{}", v);

    let v2 = List2(vec![1, 2, 3]);
    println!("{}", v2);
}
